#ifndef IWALL_H_
#define IWALL_H_
#include <Arduino.h>

class IWall
{
    private:
        // 计时器
        struct Timer {
            // 计时器名称标识符
            String name;
            // 计时器数值
            int millisecond;
        };
        // 角色
        struct Sprite {
            // 角色名称标识符
            String name;
            // 角色中心点位置
            int center_x, center_y;
            // 角色类型
            int type;
            // 角色宽和高
            int width, height;
            // 角色是否隐藏
            bool visibility;
            // 角色的图形方向和运动方向
            int graph_direct, motion_direct;
            // 角色遇到边缘处理方式
            int edge_mode;
        };
        // 文本框
        struct Textarea {
            // 文本框名称标识符
            String name;
            // 文本框左上角位置
            int top_left_x, top_left_y;
            // 文本框字体
            int font;
            // 文本框宽度
            int width;
        };
        // 计时器数组
        Timer tim[20];
        // 计时器大小、计时器计数器
        int tim_number, tim_count;
        // 发送字符串
        String send_string;
        // 接收缓冲区
        char receive_buffer[64];
        // 角色数组
        Sprite spr[20];
        // 角色大小、角色计数器
        int spr_number, spr_count;
        // Hbegin
        void Hbegin(int rx, int tx);
        // 读取串口数据
        void serial_read();
        // 查找计时器
        int lookup_timer(String timer);
        // 查找角色
        int lookup_sprite(String character);
        // 文本框数组
        Textarea txt[20];
        // 文本框大小、文本框计数器
        int txt_number, txt_count;
        // 查找文本框
        int lookup_textarea(String textarea);
    public:
        // iWall初始化
        void iWall_Init();
        // 新计时器
        String iWall_createTimer();
        // 获取计时器[TIMER]的时间（毫秒）
        int iWall_GetTimerValue(String timer);
        // 清零计时器[TIMER]
        void iWall_ClearTimer(String timer);
        // 创建角色 类型[CHARACTER_TYPE] X[POSITION_X] Y[POSITION_Y]
        String iWall_createCharacter(String character_type, int position_x, int position_y);
        // 删除角色[CHARACTER]
        void iWall_deleteCharacter(String character);
        // 角色[CHARACTER]移动[STEP]
        void iWall_characterMove(String character, int step);
        // 角色[CHARACTER]设置类型[CHARACTER_TYPE]
        void iWall_characterSetGraph(String character, String character_type);
        // 角色[CHARACTER]设置[GRAPHDIRECT]
        void iWall_characterSetGraphDirect(String character, int graphDirect);
        // 角色[CHARACTER]设置[MOTIONDIRECT]
        void iWall_characterSetMotionDirect(String character, int motionDirect);
        // 角色[CHARACTER]移动到X[POSITION_X]Y[POSITION_Y]
        void iWall_characterSetXY(String character, int position_x, int position_y);
        // 角色[CHARACTER]设置[AXIS]为[AXIS_NUMBER]
        void iWall_characterSetAxis(String character, int axis, int axis_number);
        // 角色[CHARACTER]X偏移[OFFSET_X]Y偏移[OFFSET_Y]
        void iWall_characterSetXYOffset(String character, int offset_x, int offset_y);
        // 角色[CHARACTER][AXIS]偏移[AXIS_NUMBER]
        void iWall_characterSetAxisOffset(String character, int axis, int axis_number);
        // 获得角色[CHARACTER][AXIS]坐标
        int iWall_characterGetXY(String character, int axis);
        // 获得角色[CHARACTER]图形方向
        int iWall_characterGetGraphDirect(String character);
        // 角色[GRAPHDIRECT]
        int iWall_GraphDirect(int graphDirect);
        // 获得角色[CHARACTER]运动方向
        int iWall_characterGetMotionDirect(String character);
        // 角色[MOTIONDIRECT]
        int iWall_MotionDirect(int motionDirect);
        // 角色[CHARACTER][VISIBILITY]
        void iWall_characterSetVisible(String character, bool visibility);
        // 角色[CHARACTER]移动图层到[LAYER_MODE]
        void iWall_characterSetLayer(String character, int layer_mode);
        // 角色[CHARACTER]遇到边缘[EDGE_MODE]
        void iWall_characterSetEdgeMode(String character, int edge_mode);
        // 角色[CHARACTER][FLIP]翻转
        void iWall_characterFlip(String character, int flip);
        // 角色[CHARACTER]遇到边缘时[FLIP_MODE]
        void iWall_characterSetFlipMode(String character, int flip_mode);
        // 角色[CHARACTER_A]与[CHARACTER_B]是否碰撞
        bool iWall_characterGetCharsCollision(String character_a, String character_b);
        // 获取角色[CHARACTER_A]与[CHARACTER_B]的距离
        float iWall_characterGetCharsDistance(String character_a, String character_b);
        // 获取角色[CHARACTER]与[EDGE]边界的距离
        float iWall_characterGetCharToEdgeDistance(String character, int edge);
        // 设置背景为[BACKGROUND_TYPE]
        void iWall_backSet(int background_type);
        // 背景移动[STEP]向[MOTIONDIRECT]
        void iWall_backMove(int step, int motionDirect);
        // 背景每[TIME]（毫秒）向[MOTIONDIRECT]移动一格
        void iWall_backAutoMove(int time, int motionDirect);
        // 传感器初始化[SENSOR]
        void iWall_SensorInit(int sensor_id);
        // 传感器数值获取[SENSOR_DATA]
        float iWall_SensorGet(int sensor_data_id);
        // 清空画布
        void iWall_LEDMatrixClear();
        // 红[RED]绿[GREEN]蓝[BLUE]
        long iWall_RGB(int red, int green, int blue);
        // 画点 X[POSITION_X]Y[POSITION_Y]颜色[COLOR]
        void iWall_LEDMatrixSetPixel(int position_x, int position_y, long color);
        // 画直线 起 X[START_X]Y[START_Y]止 X[END_X]Y[END_Y]颜色[COLOR]
        void iWall_LEDMatrixLine(int start_x, int start_y, int end_x, int end_y, long color);
        // 画矩形 左上 X[TOP_LEFT_X]Y[TOP_LEFT_Y]右下 X[BOTTOM_RIGHT_X]Y[BOTTOM_RIGHT_Y]颜色[COLOR]模式[RECT_MODE]
        void iWall_LEDMatrixRect(int top_left_x, int top_left_y, int bottom_right_x, int bottom_right_y, long color, int rect_mode);
        // 画面移动 方向[CANVAS_DIRECT]格数[STEP]
        void iWall_LEDMatrixShift(int canvas_direct, int step);
        // 创建文本框 X[POSITION_X]Y[POSITION_Y]字体[TEXT_FONT]宽[WIDTH]
        String iWall_createTextFrame(int position_x, int position_y, int text_font, int width);
        // 文本框[TEXTAREA]移动到 X[POSITION_X]Y[POSITION_Y]
        void iWall_textSetXY(String textarea, int position_x, int position_y);
        // 文本框[TEXTAREA]设置文字[TEXT]颜色[COLOR]
        void iWall_textSetText(String textarea, String text, long color);
        // 播放背景音乐[BACK_MUSIC_TYPE]
        void iWall_musicBackPlay(int back_music_type);
        // 背景音乐暂停
        void iWall_musicBackPause();
        // 背景音乐停止
        void iWall_musicBackStop();
        // 背景音乐继续
        void iWall_musicBackResume();
        // 播放声音[MUSIC_TYPE]
        void iWall_musicSoundPlay(int music_type);
};

#endif